import json
from collections import Counter
from datetime import datetime, timedelta

import requests

# events_list = [
#     {'id': '18', 'name': '新活动18', 'address': '深圳市福田区', 'contactPhone': '13982422674',
#      'serviceType': '教育支持', 'serviceStart': '2024-03-20 16:48', 'serviceEnd': '2024-03-07 20:48', 'money': '126',
#      'introduce': '新活动介绍18', 'gender': '女', 'age': '25-40', 'peopleNum': '13', 'contactName': '李小红'},
#     {'id': '19', 'name': '新活动19', 'address': '深圳市福田区', 'contactPhone': '13934683098',
#      'serviceType': '教育支持', 'serviceStart': '2024-03-26 16:48', 'serviceEnd': '2024-03-07 22:48', 'money': '152',
#      'introduce': '新活动介绍19', 'gender': '不限', 'age': '18-24', 'peopleNum': '14', 'contactName': '张小强'},
#     {'id': '20', 'name': '新活动20', 'address': '广州市天河区', 'contactPhone': '13959744504',
#      'serviceType': '儿童关爱', 'serviceStart': '2024-04-04 16:48', 'serviceEnd': '2024-03-07 20:48', 'money': '114',
#      'introduce': '新活动介绍20', 'gender': '不限', 'age': '25-40', 'peopleNum': '30', 'contactName': '王小明'},
#     {'id': '21', 'name': '新活动21', 'address': '北京市朝阳区', 'contactPhone': '13999465476',
#      'serviceType': '老年关怀', 'serviceStart': '2024-04-01 16:48', 'serviceEnd': '2024-03-07 22:48', 'money': '180',
#      'introduce': '新活动介绍21', 'gender': '女', 'age': '18-24', 'peopleNum': '28', 'contactName': '李小红'},
#     {'id': '22', 'name': '新活动22', 'address': '广州市天河区', 'contactPhone': '13948022188',
#      'serviceType': '社区服务', 'serviceStart': '2024-03-25 16:48', 'serviceEnd': '2024-03-07 18:48', 'money': '125',
#      'introduce': '新活动介绍22', 'gender': '女', 'age': '18-24', 'peopleNum': '8', 'contactName': '李小红'},
#     {'id': '23', 'name': '新活动23', 'address': '深圳市福田区', 'contactPhone': '13940725443',
#      'serviceType': '儿童关爱', 'serviceStart': '2024-03-15 16:48', 'serviceEnd': '2024-03-07 20:48', 'money': '99',
#      'introduce': '新活动介绍23', 'gender': '男', 'age': '18-24', 'peopleNum': '29', 'contactName': '张小强'},
#     {'id': '24', 'name': '新活动24', 'address': '北京市朝阳区', 'contactPhone': '13999082722',
#      'serviceType': '老年关怀', 'serviceStart': '2024-03-08 16:48', 'serviceEnd': '2024-03-07 21:48', 'money': '62',
#      'introduce': '新活动介绍24', 'gender': '女', 'age': '不限', 'peopleNum': '11', 'contactName': '王小明'},
#     {'id': '25', 'name': '新活动25', 'address': '深圳市福田区', 'contactPhone': '13990387791',
#      'serviceType': '教育支持', 'serviceStart': '2024-04-03 16:48', 'serviceEnd': '2024-03-07 22:48', 'money': '92',
#      'introduce': '新活动介绍25', 'gender': '女', 'age': '30-40', 'peopleNum': '7', 'contactName': '张小强'},
#     {'id': '26', 'name': '新活动26', 'address': '北京市朝阳区', 'contactPhone': '13961087320',
#      'serviceType': '社区服务', 'serviceStart': '2024-03-24 16:48', 'serviceEnd': '2024-03-07 18:48', 'money': '122',
#      'introduce': '新活动介绍26', 'gender': '不限', 'age': '25-40', 'peopleNum': '14', 'contactName': '王小明'},
#     {'id': '27', 'name': '新活动27', 'address': '广州市天河区', 'contactPhone': '13925596312',
#      'serviceType': '儿童关爱', 'serviceStart': '2024-03-20 16:48', 'serviceEnd': '2024-03-07 22:48', 'money': '53',
#      'introduce': '新活动介绍27', 'gender': '女', 'age': '25-40', 'peopleNum': '6', 'contactName': '王小明'},
#     {'id': '28', 'name': '新活动28', 'address': '北京市朝阳区', 'contactPhone': '13953302251',
#      'serviceType': '社区服务', 'serviceStart': '2024-03-18 16:48', 'serviceEnd': '2024-03-07 17:48', 'money': '115',
#      'introduce': '新活动介绍28', 'gender': '不限', 'age': '30-40', 'peopleNum': '18', 'contactName': '王小明'},
#     {'id': '29', 'name': '新活动29', 'address': '北京市朝阳区', 'contactPhone': '13963267444',
#      'serviceType': '社区服务', 'serviceStart': '2024-03-25 16:48', 'serviceEnd': '2024-03-07 21:48', 'money': '59',
#      'introduce': '新活动介绍29', 'gender': '男', 'age': '不限', 'peopleNum': '25', 'contactName': '李小红'},
#     {'id': '30', 'name': '新活动30', 'address': '广州市天河区', 'contactPhone': '13989069909',
#      'serviceType': '教育支持', 'serviceStart': '2024-03-28 16:48', 'serviceEnd': '2024-03-07 17:48', 'money': '148',
#      'introduce': '新活动介绍30', 'gender': '不限', 'age': '25-40', 'peopleNum': '20', 'contactName': '李小红'},
#     {'id': '31', 'name': '新活动31', 'address': '深圳市福田区', 'contactPhone': '13900155704',
#      'serviceType': '社区服务', 'serviceStart': '2024-04-03 16:48', 'serviceEnd': '2024-03-07 18:48', 'money': '184',
#      'introduce': '新活动介绍31', 'gender': '不限', 'age': '30-40', 'peopleNum': '11', 'contactName': '赵小云'},
#     {'id': '32', 'name': '新活动32', 'address': '深圳市福田区', 'contactPhone': '13981214374',
#      'serviceType': '儿童关爱', 'serviceStart': '2024-03-30 16:48', 'serviceEnd': '2024-03-07 19:48', 'money': '136',
#      'introduce': '新活动介绍32', 'gender': '男', 'age': '30-40', 'peopleNum': '26', 'contactName': '张小强'},
#     {'id': '33', 'name': '新活动33', 'address': '北京市朝阳区', 'contactPhone': '13910629056',
#      'serviceType': '儿童关爱', 'serviceStart': '2024-03-08 16:48', 'serviceEnd': '2024-03-07 20:48', 'money': '124',
#      'introduce': '新活动介绍33', 'gender': '不限', 'age': '25-40', 'peopleNum': '25', 'contactName': '李小红'},
#     {'id': '34', 'name': '新活动34', 'address': '深圳市福田区', 'contactPhone': '13995348775',
#      'serviceType': '老年关怀', 'serviceStart': '2024-03-31 16:48', 'serviceEnd': '2024-03-07 18:48', 'money': '106',
#      'introduce': '新活动介绍34', 'gender': '男', 'age': '18-24', 'peopleNum': '23', 'contactName': '赵小云'},
#     {'id': '35', 'name': '新活动35', 'address': '广州市天河区', 'contactPhone': '13943332962',
#      'serviceType': '社区服务', 'serviceStart': '2024-03-13 16:48', 'serviceEnd': '2024-03-07 20:48', 'money': '57',
#      'introduce': '新活动介绍35', 'gender': '男', 'age': '18-24', 'peopleNum': '8', 'contactName': '李小红'},
#     {'id': '36', 'name': '新活动36', 'address': '深圳市福田区', 'contactPhone': '13958200045',
#      'serviceType': '儿童关爱', 'serviceStart': '2024-03-20 16:48', 'serviceEnd': '2024-03-07 20:48', 'money': '135',
#      'introduce': '新活动介绍36', 'gender': '男', 'age': '30-40', 'peopleNum': '7', 'contactName': '王小明'},
#     {'id': '37', 'name': '新活动37', 'address': '北京市朝阳区', 'contactPhone': '13961756470',
#      'serviceType': '教育支持', 'serviceStart': '2024-03-13 16:48', 'serviceEnd': '2024-03-07 18:48', 'money': '166',
#      'introduce': '新活动介绍37', 'gender': '不限', 'age': '18-24', 'peopleNum': '8', 'contactName': '张小强'},
#
# ]



user_events_list = [
    {'id': '18', 'name': '新活动18', 'address': '深圳市福田区', 'contactPhone': '13947537800',
     'serviceType': '教育支持', 'serviceStart': '2024-03-07 17:21', 'serviceEnd': '2024-03-07 21:21', 'money': '154',
     'introduce': '新活动介绍18', 'gender': '女', 'age': '18-24', 'peopleNum': '10', 'contactName': '赵小云'},
    {'id': '19', 'name': '新活动19', 'address': '深圳市福田区', 'contactPhone': '13939988163',
     'serviceType': '儿童关爱', 'serviceStart': '2024-03-07 17:21', 'serviceEnd': '2024-03-07 20:21', 'money': '125',
     'introduce': '新活动介绍19', 'gender': '不限', 'age': '不限', 'peopleNum': '8', 'contactName': '赵小云'},
    {'id': '20', 'name': '新活动20', 'address': '深圳市福田区', 'contactPhone': '13971076936',
     'serviceType': '教育支持', 'serviceStart': '2024-03-07 17:21', 'serviceEnd': '2024-03-07 21:21', 'money': '127',
     'introduce': '新活动介绍20', 'gender': '男', 'age': '18-24', 'peopleNum': '12', 'contactName': '李小红'},
    {'id': '21', 'name': '新活动21', 'address': '深圳市福田区', 'contactPhone': '13964506480',
     'serviceType': '教育支持', 'serviceStart': '2024-03-07 17:21', 'serviceEnd': '2024-03-07 21:21', 'money': '121',
     'introduce': '新活动介绍21', 'gender': '女', 'age': '18-24', 'peopleNum': '18', 'contactName': '李小红'},
    {'id': '22', 'name': '新活动22', 'address': '广州市天河区', 'contactPhone': '13932235537',
     'serviceType': '儿童关爱', 'serviceStart': '2024-03-07 17:21', 'serviceEnd': '2024-03-07 18:21', 'money': '165',
     'introduce': '新活动介绍22', 'gender': '女', 'age': '25-40', 'peopleNum': '7', 'contactName': '李小红'},
    {'id': '23', 'name': '新活动23', 'address': '广州市天河区', 'contactPhone': '13952964858',
     'serviceType': '老年关怀', 'serviceStart': '2024-03-07 17:21', 'serviceEnd': '2024-03-07 22:21', 'money': '90',
     'introduce': '新活动介绍23', 'gender': '不限', 'age': '30-40', 'peopleNum': '11', 'contactName': '张小强'},
    {'id': '24', 'name': '新活动24', 'address': '广州市天河区', 'contactPhone': '13935442898',
     'serviceType': '教育支持', 'serviceStart': '2024-03-07 17:21', 'serviceEnd': '2024-03-07 21:21', 'money': '142',
     'introduce': '新活动介绍24', 'gender': '女', 'age': '25-40', 'peopleNum': '29', 'contactName': '李小红'},
    {'id': '25', 'name': '新活动25', 'address': '深圳市福田区', 'contactPhone': '13940224183',
     'serviceType': '老年关怀', 'serviceStart': '2024-03-07 17:21', 'serviceEnd': '2024-03-07 18:21', 'money': '74',
     'introduce': '新活动介绍25', 'gender': '女', 'age': '不限', 'peopleNum': '18', 'contactName': '赵小云'},
    {'id': '26', 'name': '新活动26', 'address': '广州市天河区', 'contactPhone': '13942430203',
     'serviceType': '老年关怀', 'serviceStart': '2024-03-07 17:21', 'serviceEnd': '2024-03-07 19:21', 'money': '175',
     'introduce': '新活动介绍26', 'gender': '不限', 'age': '不限', 'peopleNum': '24', 'contactName': '王小明'},
]

events_list2 = requests.get("http://192.168.31.214:1006/queryAllActive")
events_list2 = json.loads(events_list2.text)
events_list = events_list2['data']
print(events_list)
# 用户年龄
user_age = 20

# 需要使用用户多少条历史数据
x = 5

# 地址字段
address_list = []

# 服务类型字段
service_type_list = []

# 服务时间字段
service_time_list = []

# 时间币字段
timeCoin_list = []

# 服务建议的年龄
service_age_list = []

# 服务总人数
service_peopleNum_list = []

# 获取各字段权重占比
for i in range(x):
    event = user_events_list[i]
    address_list.append(event['address'])
    service_type_list.append(event['serviceType'])
    service_start = datetime.strptime(event['serviceStart'], '%Y-%m-%d %H:%M')  # 将字符串转换为 datetime 对象
    service_end = datetime.strptime(event['serviceEnd'], '%Y-%m-%d %H:%M')
    time_diff = service_end - service_start  # 计算时间差
    service_time_list.append(time_diff.total_seconds() // 3600)  # 将时间差转换为小时并加入列表
    timeCoin_list.append(event['money'])

    user_age = 24  # 假设用户年龄为 25 岁

    if event['age'] == "不限":
        service_age_list.append('不限')
    else:
        min_age, max_age = map(int, event['age'].split('-'))
        if min_age <= user_age <= max_age:
            service_age_list.append('正常')
        else:
            service_age_list.append('不限')

    service_peopleNum_list.append(int(event['peopleNum']))  # 将参与人数转换为整数加入列表

print("======================历史活动结果==========================")
print(address_list)
print(service_type_list)
print(service_time_list)
print(timeCoin_list)
print(service_age_list)
print(service_peopleNum_list)
print("====================================================")

# 统计各字段出现的次数
address_counts = Counter(address_list)
service_type_counts = Counter(service_type_list)
service_time_sum = sum(service_time_list)  # 服务时间总和
timeCoin_sum = sum(map(int, timeCoin_list))  # 时间币总和
service_peopleNum_sum = sum(service_peopleNum_list)  # 服务人数总和
service_age_counts = Counter(service_age_list)
service_peopleNum_counts = Counter(service_peopleNum_list)

# 找出出现次数最多的字段
# 使用Counter对象的most_common()方法来找出出现频率最高的元素
# 参数1表示我们只想要找出出现频率最高的一个元素
# 返回的结果是一个列表，其中包含一个元组，元组的第一个元素是出现频率最高的元素，第二个元素是它出现的次数
# 通过索引[0]，选择了这个列表中的第一个元素，即出现频率最高的元素对应的元组
# 最后一步是选择出现频率最高的元素，也就是元组中的第一个元素，因此使用索引[0]

most_common_address = address_counts.most_common(1)[0][0]  # 最佳地址
most_common_service_type = service_type_counts.most_common(1)[0][0]  # 最佳服务类型
average_service_time = service_time_sum / len(service_time_list)  # 计算平均服务时间
average_timeCoin = timeCoin_sum / len(timeCoin_list)  # 计算平均时间币
average_service_peopleNum = service_peopleNum_sum / len(service_peopleNum_list)  # 计算平均服务人数
most_common_service_age = service_age_counts.most_common(1)[0][0]  # 平均服务活动年龄
most_common_service_peopleNum = service_peopleNum_counts.most_common(1)[0][0]  # 平均服务活动人数

# 添加用户推荐权重
user_recommendation_weight = []
user_recommendation_weight.append((
    most_common_address, most_common_service_type, average_service_time, average_timeCoin,
    average_service_peopleNum, most_common_service_age, most_common_service_peopleNum))

# 打印结果
print("======================权重结果==========================")
print("出现最多的地址：", most_common_address)
print("出现最多的服务类型：", most_common_service_type)
print("平均服务时间：", average_service_time)
print("平均时间币：", average_timeCoin)
print("平均服务人数：", average_service_peopleNum)
print("出现最多的服务年龄建议：", most_common_service_age)
print("出现最多的服务总人数：", most_common_service_peopleNum)
print("================================================")

recommend_user_list = []

for event in events_list:
    # 找地址字段
    address_weight = 1 if event['address'] == most_common_address else 0

    # 找服务类型字段
    service_type_weight = 1 if event['serviceType'] == most_common_service_type else 0

    # 找时间字段
    service_start = datetime.strptime(event['serviceStart'], '%Y-%m-%d %H:%M')  # 将字符串转换为 datetime 对象
    service_end = datetime.strptime(event['serviceEnd'], '%Y-%m-%d %H:%M')
    time_diff = service_end - service_start  # 计算时间差
    # 将平均服务时间转换为 timedelta 类型的对象
    average_service_time_timedelta = timedelta(hours=average_service_time)

    # 比较时间差是否在范围内
    service_time_weight = 1 if average_service_time_timedelta - timedelta(
        hours=1) <= time_diff <= average_service_time_timedelta + timedelta(hours=1) else 0

    # 找时间币字段
    timeCoin_weight = 1 if average_timeCoin - 20 <= int(event['money']) <= average_timeCoin + 20 else 0

    # 找服务人数字段
    service_peopleNum_weight = 1 if average_service_peopleNum - 5 <= int(
        event['peopleNum']) <= average_service_peopleNum + 5 else 0

    # 找服务年龄字段
    service_age_weight = 1 if event['age'] == most_common_service_age else 0

    total_weight = address_weight + service_type_weight + service_time_weight + timeCoin_weight + service_peopleNum_weight + service_age_weight

    recommend_user_list.append((event['id'], total_weight))
# 按照权重降序排列
recommend_user_list.sort(key=lambda x: x[1], reverse=True)
print(recommend_user_list)

# 获取权重最高的活动ID
# 设定需要推荐的活动数量
recommendation_count = 3
recommendation_printed = 0

# 获取权重最高的活动ID
if recommend_user_list:
    for event_id in recommend_user_list:
        for event in events_list:
            if event['id'] == event_id:
                print("最终推荐的活动信息：")
                print("活动名称:", event['name'])
                print("活动地址:", event['address'])
                print("联系电话:", event['contactPhone'])
                print("活动类型:", event['serviceType'])
                print("活动开始时间:", event['serviceStart'])
                print("活动结束时间:", event['serviceEnd'])
                print("可获取的时间币:", event['money'])
                print("活动介绍:", event['introduce'])
                print("推荐年龄:", event['age'])
                print("参与人数:", event['peopleNum'])
                print("联系人名字:", event['contactName'])
                print()

                recommendation_printed += 1
                if recommendation_printed == recommendation_count:
                    break
        if recommendation_printed == recommendation_count:
            break
else:
    print("没有找到符合条件的活动。")
